﻿using System;

/// <summary>
/// 1. 模式的结构
/// 职责链模式主要包含以下角色。
/// 抽象处理者（Handler）角色：定义一个处理请求的接口，包含抽象处理方法和一个后继连接。
/// 具体处理者（Concrete Handler）角色：实现抽象处理者的处理方法，判断能否处理本次请求，如果可以处理请求则处理，否则将该请求转给它的后继者。
/// 客户类（Client）角色：创建处理链，并向链头的具体处理者对象提交请求，它不关心处理细节和请求的传递过程。
/// </summary>
namespace ChainOfResponsibility
{
    class Program
    {
        static void Main(string[] args)
        {
            //组装责任链 
            Handler handler1 = new ConcreteHandler1();
            Handler handler2 = new ConcreteHandler2();
            handler1.setNext(handler2);
            //提交请求 
            handler1.handleRequest("two");
        }
    }
    //抽象处理者角色
    abstract class Handler
    {
        private Handler next;
        public void setNext(Handler next)
        {
            this.next = next;
        }
        public Handler getNext()
        {
            return next;
        }
        //处理请求的方法
        public abstract void handleRequest(String request);
    }
    //具体处理者角色1
    class ConcreteHandler1 : Handler
    {
        public override void handleRequest(String request)
        {
            if (request == "one")
            {
                Console.WriteLine("具体处理者1负责处理该请求！");
            }
            else
            {
                if (getNext() != null)
                {
                    getNext().handleRequest(request);
                }
                else
                {
                    Console.WriteLine("没有人处理该请求！");
                }
            }
        }
    }
    //具体处理者角色2
    class ConcreteHandler2 : Handler
    {
        public override void handleRequest(String request)
        {
            if (request == "two")
            {
                Console.WriteLine("具体处理者2负责处理该请求！");
            }
            else
            {
                if (getNext() != null)
                {
                    getNext().handleRequest(request);
                }
                else
                {
                    Console.WriteLine("没有人处理该请求！");
                }
            }
        }
    }
}
